import { OnlineFormEventType } from '@/common/staticDict/index';
import { findItemFromList } from '@/common/utils';
import { ANY_OBJECT } from '@/types/generic';

export const OnlineFormEventList = [
  {
    id: OnlineFormEventType.CHANGE,
    name: '组件数据改变',
    functionName: 'onChange',
    paramList: ['val', 'detail', 'instance'],
    comment: `
/**
 * 组件数据改变时触发
 * @params val 组件当前值
 * @params detail 组件当前值详情(selectRow, dictData)
 * @params instance 表单组件
 */
`,
  },
  {
    id: OnlineFormEventType.BLUR,
    name: '组件失去焦点',
    functionName: 'onBlur',
    paramList: ['instance'],
    comment: `
/**
 * 组件失去焦点时触发
 * @params instance 表单组件
 */
`,
  },
  {
    id: OnlineFormEventType.FOCUS,
    name: '组件获取焦点',
    functionName: 'onFocus',
    paramList: ['instance'],
    comment: `
/**
 * 组件获取焦点时触发
 * @params instance 表单组件
 */
`,
  },
  {
    id: OnlineFormEventType.DISABLE,
    name: '是否禁用',
    functionName: 'disabled',
    paramList: ['instance'],
    comment: `
/**
 * 组件是否禁用
 * @params instance
 */
return false;
`,
  },
  {
    id: OnlineFormEventType.VISIBLE,
    name: '是否可见',
    functionName: 'visible',
    paramList: ['instance'],
    comment: `
/**
 * 组件是否可见
 * @params instance
 */
return true;
`,
  },
  {
    id: OnlineFormEventType.DROPDOWN_CHANGE,
    name: '组件下拉数据改变',
    functionName: 'onDropdownChange',
    paramList: ['dataList', 'instance'],
    comment: `
/**
 * 组件下拉数据改变时触发
 * @params dataList 下拉数据
 * @params instance 表单组件
 */
return dataList;
`,
  },
  {
    id: OnlineFormEventType.DISABLED_DATE,
    name: '日期组件设置日期是否禁用函数',
    functionName: 'disabledDate',
    paramList: ['date'],
    comment: `
/**
 * 日期组件设置日期是否禁用函数，返回Boolean
 * @params date 当前日期
 */
return false;
`,
  },
  {
    id: OnlineFormEventType.AFTER_LOAD_TABLE_DATA,
    name: '表格读取数据后回调',
    functionName: 'afterLoadTableData',
    paramList: ['dataList', 'instance'],
    comment: `
/**
 * 读取列表数据后触发
 * @params dataList
 * @params instance
 */
return dataList;
`,
  },
  {
    id: OnlineFormEventType.BEFORE_LOAD_TABLE_DATA,
    name: '表格读取数据前回调',
    functionName: 'beforeLoadTableData',
    paramList: ['params', 'instance'],
    comment: `
/**
 * 读取表格数据前触发
 * @params params 请求参数
 * @params instance 表单组件
 */
 return params;
`,
  },
  {
    id: OnlineFormEventType.AFTER_LOAD_FORM_DATA,
    name: '表单页面加载数据后回调',
    functionName: 'afterLoadFormData',
    paramList: ['instance'],
    comment: `
/**
 * 表单页面加载数据后触发
 * @params instance 表单组件
 */
`,
  },
  {
    id: OnlineFormEventType.BEFORE_COMMIT_FORM_DATA,
    name: '表单页面提交数据前回调',
    functionName: 'beforeCommitFormData',
    paramList: ['params', 'instance'],
    comment: `
/**
 * 表单页面提交数据前触发
 * @params params 请求参数
 * @params instance 表单组件
 */
return params;
`,
  },
  {
    id: OnlineFormEventType.AFTER_CREATE_FORM,
    name: '表单页面创建完毕',
    functionName: 'formCreated',
    paramList: ['instance'],
    comment: `
/**
 * 表单页面创建完毕，可用于初始化表单数据
 * @params instance 表单组件
 */
`,
  },
  {
    id: OnlineFormEventType.OPERATION_VISIBLE,
    name: '操作是否可见',
    functionName: 'operationVisible',
    paramList: ['rowData', 'instance'],
    comment: `
/**
 * 操作是否可见
 * @params rowData 表格行内操作当前行数据
 * @params instance 表单组件
 */
return true;
`,
  },
  {
    id: OnlineFormEventType.OPERATION_DISABLED,
    name: '操作是否禁用',
    functionName: 'operationDisabled',
    paramList: ['rowData', 'instance'],
    comment: `
/**
 * 操作是否禁用
 * @params rowData 表格行内操作当前行数据
 * @params instance 表单组件
 */
return false;
`,
  },
  {
    id: OnlineFormEventType.LINK_HERF,
    name: '超链接地址',
    functionName: 'linkHerf',
    paramList: ['herf', 'instance'],
    comment: `
/**
 * 计算超链接地址
 * @params herf 参数中设置的herf
 * @params instance 表单组件
 * @return 返回新的地址
 */
return herf;
`,
  },
  {
    id: OnlineFormEventType.OPERATION_CLICK,
    name: '操作点击事件',
    functionName: 'operationClick',
    paramList: ['rowData', 'instance'],
    comment: `
/**
 * 操作点击事件
 * @params rowData 表格行内操作当前行数据
 * @params instance 表单组件
 */
`,
  },
  {
    id: OnlineFormEventType.CELL_CLICK,
    name: '表格单元格点击事件',
    functionName: 'tableCellClick',
    paramList: ['rowData', 'instance'],
    comment: `
/**
 * 表格单元格点击事件
 * @params rowData 表格行内操作当前行数据
 * @params instance 表单组件
 */
`,
  },
  // Jie. 20250418 添加单元格渲染事件
  {
    id: OnlineFormEventType.CELL_RENDER,
    name: '表格单元格渲染事件',
    functionName: 'tableCellRender',
    paramList: ['rowData', 'instance', 'h', 'elComp'],
    comment: `
/**
 * 表格单元格渲染事件
 * @params rowData 表格行内操作当前行数据
 * @params instance 表单组件
 * @params h vue h函数
 * @params elComp element组件实例
 */
`,
  },
  {
    id: OnlineFormEventType.DIALOG_OPEN,
    name: '选择对话框过滤事件',
    functionName: 'dialogOpen',
    paramList: ['params', 'instance'],
    comment: `
/**
  * 选择对话框过滤事件
  * @params params 请求参数
  * @params instance 表单组件
  */
return params;
`,
  },
  {
    id: OnlineFormEventType.DIALOG_SUBMIT,
    name: '选择对话框回调事件',
    functionName: 'dialogSubmit',
    paramList: ['selectItem', 'instance'],
    comment: `
/**
  * 选择对话框回调事件
  * @params selectItem 选择的数据列表或者对象
  * @params instance 表单组件
  */
`,
  },
  {
    id: OnlineFormEventType.INLINE_VALUE_CHANGE,
    name: '行内编辑值改变',
    functionName: 'inlineValueChange',
    paramList: ['value', 'rowData', 'detail', 'instance'],
    comment: `
/**
 * 行内编辑值改变
 * @params value 当前值
 * @params rowData 当前行数据
 * @params detail 组件当前值详情(selectRow, dictData)
 * @params instance 表单组件
 */
`,
  },
  {
    id: OnlineFormEventType.INLINE_DISABLED,
    name: '行内编辑是否禁用',
    functionName: 'inlineDisabled',
    paramList: ['rowData', 'instance'],
    comment: `
/**
 * 行内编辑是否禁用
 * @params rowData 当前行数据
 * @params instance 表单组件
 * @return 返回true禁用，false不禁用
 */
return false;
`,
  },
  {
    id: OnlineFormEventType.CELL_TAG_TYPE,
    name: '单元格标签类型',
    functionName: 'cellTagType',
    paramList: ['rowData'],
    comment: `
/**
 * 单元格标签类型
 * @params rowData 当前行数据
 * @params instance 表单组件
 */
return 'primary';
`,
  },
  {
    id: OnlineFormEventType.FOOTER_DATA,
    name: '表格底部数据',
    functionName: 'footerData',
    paramList: ['dataList', 'instance'],
    comment: `
/**
 * 表格底部数据
 * @params dataList 表格数据
 * @params instance 表单组件
 * @return 返回底部数据，https://vxetable.cn/#/component/table/base/footer
 */
return undefined;
`,
  },
  {
    id: OnlineFormEventType.LINK_CLICK,
    name: '超链接点击事件',
    functionName: 'linkClick',
    paramList: ['herf', 'instance'],
    comment: `
/**
 * 超链接点击事件
 * @params herf 超链接地址
 * @params instance 表单组件
 */
return herf;
`,
  },
  {
    id: OnlineFormEventType.REPORT_CELL_CLICK,
    name: '报表单元格点击事件',
    functionName: 'reportCellClick',
    paramList: ['rowData', 'colData', 'instance'],
    comment: `
/**
 * 报表单元格点击事件
 * @params rowData 报表行数据
 * @param colData 报表列数据
 * @params instance 表单组件
 */
`,
  },
  {
    id: OnlineFormEventType.SERIE_CLICK,
    name: '点击事件',
    functionName: 'serieClick',
    paramList: ['rowData', 'instance'],
    comment: `
/**
 * 点击事件
 * @params rowData 报表行数据
 * @params instance 表单组件
 */
`,
  },
];

export const OnlineMobileFormEventList = [
  {
    id: OnlineFormEventType.CHANGE,
    name: '组件数据改变',
    functionName: 'onChange',
    paramList: ['val'],
    comment: `
/**
 * 组件数据改变时触发
 * @params val 组件当前值
 * @params this 表单组件
 */
`,
  },
  {
    id: OnlineFormEventType.DISABLE,
    name: '是否禁用',
    functionName: 'disabled',
    paramList: [],
    comment: `
/**
 * 组件是否禁用
 * @params this
 */
return false;
`,
  },
  {
    id: OnlineFormEventType.VISIBLE,
    name: '是否可见',
    functionName: 'visible',
    paramList: [],
    comment: `
/**
 * 组件是否可见
 * @params this
 */
return true;
`,
  },
  {
    id: OnlineFormEventType.DROPDOWN_CHANGE,
    name: '组件下拉数据改变',
    functionName: 'onDropdownChange',
    paramList: ['dataList'],
    comment: `
/**
 * 组件下拉数据改变时触发
 * @params dataList 下拉数据
 * @params this 表单组件
 */
return dataList;
`,
  },
  {
    id: OnlineFormEventType.DISABLED_DATE,
    name: '日期组件设置日期是否禁用函数',
    functionName: 'disabledDate',
    paramList: ['date'],
    comment: `
/**
 * 日期组件设置日期是否禁用函数，返回Boolean
 * @params date 当前日期
 */
return false;
`,
  },
  {
    id: OnlineFormEventType.AFTER_LOAD_TABLE_DATA,
    name: '表格读取数据后回调',
    functionName: 'afterLoadTableData',
    paramList: ['dataList'],
    comment: `
/**
 * 读取列表数据后触发
 * @params dataList
 * @params this 表单组件
 */
return dataList;
`,
  },
  {
    id: OnlineFormEventType.BEFORE_LOAD_TABLE_DATA,
    name: '表格读取数据前回调',
    functionName: 'beforeLoadTableData',
    paramList: ['params'],
    comment: `
/**
 * 读取表格数据前触发
 * @params params 请求参数
 * @params this 表单组件
 */
return params;
`,
  },
  {
    id: OnlineFormEventType.AFTER_LOAD_FORM_DATA,
    name: '表单页面加载数据后回调',
    functionName: 'afterLoadFormData',
    paramList: [],
    comment: `
/**
 * 表单页面加载数据后触发
 * @params this 表单组件
 */
`,
  },
  {
    id: OnlineFormEventType.BEFORE_COMMIT_FORM_DATA,
    name: '表单页面提交数据前回调',
    functionName: 'beforeCommitFormData',
    paramList: ['params'],
    comment: `
/**
 * 表单页面提交数据前触发
 * @params params 请求参数
 * @params this 表单组件
 */
return params;
`,
  },
  {
    id: OnlineFormEventType.AFTER_CREATE_FORM,
    name: '表单页面创建完毕',
    functionName: 'formCreated',
    paramList: [],
    comment: `
/**
 * 表单页面创建完毕，可用于初始化表单数据
 * @params this 表单组件
 */
`,
  },
  {
    id: OnlineFormEventType.OPERATION_VISIBLE,
    name: '操作是否可见',
    functionName: 'operationVisible',
    paramList: ['rowData'],
    comment: `
/**
 * 操作是否可见
 * @params rowData 表格行内操作当前行数据
 * @params this 表单组件
 */
return true;
`,
  },
  {
    id: OnlineFormEventType.OPERATION_DISABLED,
    name: '操作是否禁用',
    functionName: 'operationDisabled',
    paramList: ['rowData'],
    comment: `
/**
 * 操作是否禁用
 * @params rowData 表格行内操作当前行数据
 * @params this 表单组件
 */
return false;
`,
  },
  {
    id: OnlineFormEventType.LINK_HERF,
    name: '超链接地址',
    functionName: 'linkHerf',
    paramList: ['herf'],
    comment: `
/**
 * 计算超链接地址
 * @params herf 参数中设置的herf
 * @params this 表单组件
 * @return 返回新的地址
 */
return herf;
`,
  },
];

export function eventFunction(event: ANY_OBJECT) {
  if (!event) return null;
  const eventInfo = findItemFromList(OnlineFormEventList, event.eventType, 'id');
  if (!eventInfo || event.scriptString == null || event.scriptString === '') {
    console.warn('eventFunction eventInfo is null, eventType=', event.eventType);
    return null;
  }
  return new Function(eventInfo.paramList, event.scriptString);
}
